package com.excel.write;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.excel.entity.ComplexHeadData;
import com.excel.entity.DemoData;
import com.excel.entity.IndexData;
import com.excel.entity.OrderData;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.testng.annotations.Test;

import java.text.DateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * ClassName:simpleWrite
 * Package:com.excel.write
 * Description
 *
 * @Author:@wenxueshi
 * @Create:2023/7/9 - 15:09
 * @Version:v1.0
 */
public class simpleWrite {

    /*private List<DemoData> data() {
        List<DemoData> list = ListUtils.newArrayList();
        for (int i = 0; i < 10; i++) {
            DemoData data = new DemoData();
            data.setString("字符串" + i);
            data.setDateTime(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));
            data.setDoubleData(0.56);
            list.add(data);
        }
        return list;
    }*/

    /*private List<IndexData> data() {
        List<IndexData> list = ListUtils.newArrayList();
        for (int i = 0; i < 10; i++) {
            IndexData data = new IndexData();
            data.setString("字符串" + i);
            data.setDateTime(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));
            data.setDoubleData(0.56);
            list.add(data);
        }
        return list;
    }*/

    /*private List<OrderData> data() {
        List<OrderData> list = ListUtils.newArrayList();
        for (int i = 0; i < 10; i++) {
            OrderData data = new OrderData();
            data.setString("字符串" + i);
            data.setDateTime(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));
            data.setDoubleData(0.56);
            list.add(data);
        }
        return list;
    }*/

    private List<ComplexHeadData> data() {
        List<ComplexHeadData> list = ListUtils.newArrayList();
        for (int i = 0; i < 10; i++) {
            ComplexHeadData data = new ComplexHeadData();
            data.setString("字符串" + i);
            data.setDateTime(new DateTime().toString("yyyy-MM-dd HH:mm:ss"));
            data.setDoubleData(0.56);
            list.add(data);
        }
        return list;
    }

    /**
     * 最简单的写
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DemoData}
     * <p>
     * 2. 直接写即可
     */
    @Test
    public void simpleWrite() {
        // 注意 simpleWrite在数据量不大的情况下可以使用（5000以内，具体也要看实际情况），数据量大参照 重复多次写入
        // 写法1 JDK8+
        // since: 3.0.0-beta1
        String path = "D:\\excel\\";
        String fileName = path + "simpleWrite.xlsx";
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
        System.out.println("excel导出成功");
    }

    /**
     * 根据参数只导出指定列
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link DemoData}
     * <p>
     * 2. 根据自己或者排除自己需要的列
     * <p>
     * 3. 直接写即可
     *
     * @since 2.1.1
     */
    @Test
    public void excludeOrIncludeWrite() {
        String path = "D:\\excel\\";
        String fileName = path + "excludeOrIncludeWrite" + ".xlsx";
        // 这里需要注意 在使用ExcelProperty注解的使用，如果想不空列则需要加入order字段，
        // 而不是index,order会忽略空列，然后继续往后，而index，不会忽略空列，在第几列就是第几列。
        // 根据用户传入字段 假设我们要忽略 date
        Set<String> excludeColumnFiledNames = new HashSet<String>();
        //将不想导出的列放到一个集合中
        excludeColumnFiledNames.add("dateTime");
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName, DemoData.class).excludeColumnFieldNames(excludeColumnFiledNames).sheet("模板")
                .doWrite(data());
        System.out.println("excel导出成功");
    }

    /**
     * 指定写入的列
     * <p>1. 创建excel对应的实体对象 参照{@link IndexData}
     * <p>2.
     * <p>3. 直接写即可
     */
    @Test
    public void indexWrite() {
        String path = "D:\\excel\\";
        String fileName = path + "indexWrite" + ".xlsx";
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName, IndexData.class).sheet("模板").doWrite(data());
    }

    /**
     * 指定写入的列
     * <p>1. 创建excel对应的实体对象 参照{@link OrderData}
     * <p>2.
     * <p>3. 直接写即可
     */
    @Test
    public void OrderWrite() {
        String path = "D:\\excel\\";
        String fileName = path + "OrderWrite" + ".xlsx";
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName, OrderData.class).sheet("模板").doWrite(data());
    }

    /**
     * 复杂头写入
     * <p>1. 创建excel对应的实体对象 参照{@link ComplexHeadData}
     * <p>2.
     * <p>3. 直接写即可
     */
    @Test
    public void complexHeadWrite() {
        String path = "D:\\excel\\";
        String fileName = path + "complexHeadWrite" + ".xlsx";
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName, ComplexHeadData.class).sheet("模板").doWrite(data());
        System.out.println("excel导出成功");
    }
}
